package com.ref.demo3;


import com.ref.demo1.Student;
import org.junit.Test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

/**
 * @ClassName RefleCtconstructionMethod
 * @Description TODO
 * @Author Kx
 * @Date 2025/3/17 15:41
 * @Version 1.0
 */
public class RefleCtconstructionMethod {

    /**
     * @description: 通过反射获取类的构造方法，如下所示：
     * public Student(String name,int age,Double weight)
     * @author: Kx
     * @date: 2025/3/17 15:47
     * @param: []
     * @return: void
     **/
    @Test
    public void test1(){
        try {
            // 1. 获取 class 对象
            Class<?> aClass = Class.forName("com.ref.demo3.Student");

            try {
                // 2. 获取构造方法对象
                Constructor<?> constructor = aClass.getConstructor(String.class, int.class, double.class);

                System.out.println(constructor);
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * @description: 使用反射实例化此类的对象，调用 show 方法，
     * show 方法把上面构造方法的三个参数信息打印输出。
     * @author: Kx
     * @date: 2025/3/17 15:56
     * @param: []
     * @return: void
     **/
    @Test
    public void test2(){
        try {
            // 1. 获取 class 对象
            Class<?> aClass = Class.forName("com.ref.demo3.Student");

            // 2. 获取构造方法对象
            Constructor<?> constructor = aClass.getConstructor(String.class, int.class, double.class);

            // 3. 实例化对象
            Object object = constructor.newInstance("Kx", 18, 180.0);

            // 4. 获取方法
            Method method = aClass.getMethod("show", String.class, int.class, double.class);

            // 5. 调用方法
            method.invoke(object, "Kx", 18, 180.0);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
